Undefined 类型

只有一个值,即特殊的 undefined。声明了但未对其加以初始化时,这个变量的值就是undefined。对未声明的变量使用typeof操作符会返回undefined。但是其它操作的话就会报错。

console.log(typeof foo) // "undefined"
console.log(foo) // ReferenceError

关于 undefined 还有一种严谨的做法就是通过 void 0 来实现。这样实现的原因是 undefined 不是 JavaScript 的关键字,也就是说可以将 undefined 作为标识符,或者说 window.undefined 的值是可以被修改的。

Null 类型

只有一个值,即特殊的 null。从逻辑角度来看,null值表示一个空对象指针,所以使用typeof操作符检测null值返回object

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null

Boolean 类型

主要介绍 Boolean() 函数

console.log(Boolean('a')) // true
console.log(Boolean('')) // false
console.log(Boolean(1)) // true
console.log(Boolean(0)) // false
console.log(Boolean(-1)) // true
console.log(Boolean(NaN)) // false
console.log(Boolean(Infinity)) // true
console.log(Boolean(-Infinity)) // true
console.log(Boolean({})) // true
console.log(Boolean(null)) // false
console.log(Boolean(undefined)) // false

Number 类型

采用IEEE754格式来表示整数和浮点数值。

// 十进制

const intNum = 55; 

// 八进制 -- 第一位必须是 0 ,后面是八进制数字序列(0 ~ 7)在严格模式下无效,并抛出错误。

const octalNum1 = 070; // 八进制的 56
const octalNum2 = 079; // 无效的八进制数值--解析为79
const octalNum3 = 08; // 无效的八进制数值--解析为8

// 十六进制 -- 前两位必须是 0x ,后面是十六进制数字(0 ~ 9 及 A ~ F),字母 A ~ F 不分大小写。

const hexNum1 = 0xA; // 十六进制的10
const hexNum1 = 0x1f; // 十六进制的31

在进行算数运算时,所有八进制和十六进制的数值都将被转换为十进制数值。

浮点数值

  1. 最高精度是17位小数。
  2. 默认情况下,ECMAScript会将小数点后面带有6个零以上的浮点数值转换为科学计数法。
  3. 永远不要测试某个特定的浮点数值。
const floatNum1 = .1; // 有效,不推荐
const floatNum2 = 1.; // 小数点后没有数字,解析为1
const floatNum3 = 10.0; // 整数,解析为10
const floatNum4 = 3.125e7; // 科学计数法。3.125乘以10的7次方。等于 31250000。

//判断两个数是否相等
function equal(n1, n2) {
    return Math.abs(n1 - n2) < Number.EPSILON;
}
equal(0.1 + 0.2, 0.3) // true

数值范围

  1. Number.MIN_VALUE。最小数值,多数浏览器这个值是 5e-324
  2. Number.MAX_VALUE。最大数值,多数浏览器这个值是 1.7976931348623157e+308
  3. 如果超出范围就会自动转为特殊的 Infinity 值,如果是正数就是 Infinity(正无穷),负数就是 -Infinity(负无穷)。
  4. isFinite() 函数判断一个数是否是有穷的。
  5. Number.NEGATIVE_INFINITY。负无穷的值。
  6. Number.POSITIVE_INFINITY。正无穷的值。

NaN

  1. 任何涉及NaN的操作都会返回NaN。
  2. NaN不等于任何值,包括NaN本身。
  3. 通过 isNaN() 函数检查传入的参数是否“不是数值”。

    console.log(0/0); // NaN
    console.log(10/0); // Infinity
    console.log(-10/0); // -Infinity
    console.log(10/'a'); // NaN
    console.log(10/''); // Infinity
    console.log(10/undefined); // NaN
    console.log(10/true); // 10
    console.log(10/false); // Infinity 
    console.log(10/null); // Infinity
    
    console.log(isNaN(NaN)); // true
    console.log(isNaN(10)); // false
    console.log(isNaN("10")); // false -- 可以被转换成数值10
    console.log(isNaN("blue")); // true -- 不能转换成数值
    console.log(isNaN(true)); // true -- 可以被转换成数值 1
    
    // isNaN() 也适用于对象。会先调用对象的 valueOf() 方法,如果返回值不能转换为数值,则基于这个返回值再调用 toString() 方法,再测试返回值。

数值转换

  1. Number()
  2. parseInt()
  3. parseFloat()
console.log(Number(10)); // 10
console.log(Number("")); // 0
console.log(Number("abc")); // NaN
console.log(Number("000011")); // 11
console.log(Number("123abc")); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0

// 使用 parseInt() 推荐始终带上第二个参数:转换时使用的基数(即多少进制)。
console.log(parseInt(22.5); // 22
console.log(parseInt("")); // NaN
console.log(parseInt("70")); // 70
console.log(parseInt("123abc")); // 1234
console.log(parseInt("070")); // ECMAScript 5 认为是70(十进制),ECMAScript 3 认为是56(八进制)
console.log(parseInt("0xA")); // 10
console.log(parseInt("0xf")); // 15

// parseFloat() 会解析每个字符,或解析到遇见一个无效的浮点数字符为止。而且始终会忽略前导的零。只解析十进制值。

console.log(parseFloat("22.5")); // 22.5
console.log(parseFloat("123abc")); // 123
console.log(parseFloat("0xA")); // 0
console.log(parseFloat("22.34.5")); // 22.34
console.log(parseFloat("0908.5")); // 908.5
console.log(parseFloat("3.125e7")); // 31250000

String 类型

String 类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。任何字符串的长度都可以通过访问其length属性取得。

字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列。
字面量 含义
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号 ( ' ) ,在用单引号表示的字符串中使用,例如: 'He said,  \'hey.\' '
\" 双引号 ( " ) ,在用双引号表示的字符串中使用,例如: "He said,  \"hey.\" "
\xnn 以十六进制代码 nn 表示的一个字符(其中 n 为 0 ~ F)。例如, x41 表示 'A'
\unnnn 以十六进制代码 nnnn 表示的一个 Unicode 字符(其中 n 为 0 ~ F)。例如, u03a3 表示希腊字符 Σ

转换为字符串

1. toString()
除了nullundefined没有这个方法,其它都有。有一个参数:输出数值的基数,默认是十进制。

const num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"

const bool = true;
console.log(bool.toString()); // "true"

const obj = {};
console.log(obj.toString()); // "[object Object]"

const func = function() {};
console.log(func.toString()); // "function() {}"

const nul = null;
console.log(nul.toString()); // TypeError: Cannot read property 'toString' of null

const unde= undefined;
console.log(unde.toString()); // TypeError: Cannot read property 'toString' of undefined

2. String()
在不知道要转换的值是不是nullundefined的情况下,还可以使用转型函数String(),这个可以将任何类型的值转为字符串。遵循以下转换规则

  • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
  • 如果值是null,则返回"null"
  • 如果值是undefined,则返回"undefined"

3. 使用加号操作符与一个字符串(" ")加在一起

const bool = true;
console.log(bool + ""); // "true"

const nul = null;
console.log(nul + ""); // "null"

const unde= undefined;
console.log(unde + ""); // "undefined"

typeof 操作符

// typeof的操作数可以是变量也可以是字面量
console.log(typeof foo) // "undefined"
console.log(typeof true) // "boolean"
console.log(typeof "abcd") // "string"
console.log(typeof 1) // "number"
console.log(typeof null) // "object"
console.log(typeof {}) // "object"
console.log(typeof function(){}) // "function"

参考

《JavaScript高级程序设计》(第三版)


achuan9
37 声望3 粉丝

lalala~